home *** CD-ROM | disk | FTP | other *** search
- 386用逆アセンブラ:DISGAS.EXE Ver.1.00 By Jouji
-
- ◆プログラム概要
- このプログラムはCPU386のプロテクトモード、32ビットアドレッシングプ
- ログラムのバイナリイメージをGAS(GNUアセンブラ)形式のニーモニックに変
- 換するためのものです。要するに、*.EXP、*.OBJ、*.Oファイル等を逆
- アセンブルして解析するためのものです。
- 私はFM-TOWNS2UX20のユーザーですが、現在UXのユーザーは結構多
- いのではないでしょうか。UXのユーザーの方はご存知でしょうが、UXではBAS
- ICコンパイラV1.1L21でコンパイルした*.EXPのプログラムが動きませ
- ん。フリコレ3~5にはこのようなプログラムが結構あって、起動しようとしたら画
- 面が真っ暗になってそのままハングアップという経験をお持ちの方もたくさんいらっ
- しゃることと思います。L21Dで再コンパイルしていただければ動くようになるの
- ですが、L21D版が出ないものも結構あるようです。
- 自分のマシンで動かないプログラムがあるということは気になるものです。Oh!
- FM-TOWNSによるとプログラムの起動時に数値演算コプロセッサ387の識別
- に失敗してハングアップしているということです。それならプログラムにパッチを当
- てて、387の識別の所を強制的に387無し(UXでは387は付けられないので)
- としてしまえばよいのではないかと考えた訳です。しかし、*.EXPプログラムの
- 解析をしようにも386対応のデバッガが無い!仕方がないのでSYMDEB.EX
- Eを使ってみました。そしたら、もう大変。オペランドのサイズが2バイトと4バイ
- トというように違うので、これを解析するのには気の遠くなるような手間がかかりそ
- うです。そこで一念発起、逆アセンブラを作ってしまえという訳でできたのがこのプ
- ログラムです。
-
-
- ◆起動方法
- プログラムはLSI-C86試食版によってコンパイルされており、MS-DOS
- 汎用です。T-OSのコマンドモードあるいはMS-DOSのコマンドラインから次
- のようにして起動してください。
-
- disgas [-d] [-sHex_num] [-eHex_num] [-aHex_num] File_name
-
- 対象のファイル名はLSI-C86のワイルドカード展開機能に合致するワイルド
- カード文字が使用できます。ただし処理の対象となるのはワイルドカードの展開を行
- ってソートされた一番最初のファイルだけです。
- オプションの意味は次の通りです。
-
- -d:逆アセンブルリストにコードのダンプデータを付加する。
- -s:逆アセンブル開始位置指定。ファイル先頭からのオフセットを表す16進
- データを付ける。
- -e:逆アセンブル終了位置指定。ファイル先頭からのオフセットを表す16進
- データを付ける。
- -a:逆アセンブル開始位置におけるアドレス(EIPの値)指定。アドレスを
- 表す16進データを付ける。
-
- オプションは全て省略可能であり、省略した場合の動作は、ダンプデータは無し、
- -s0 -effffffff -a0 と同じになります。
-
-
- ◆動作
- このプログラムは、対象プログラムのデフォルトのオペランドサイズ、アドレスサ
- イズが32ビットであるとして逆アセンブルします。オペランドサイズプリフィック
- スは一応サポートしていますが、疑似ニーモニック「opsize」を出力する仕様になっ
- ています。アドレスサイズプリフィックスは全くサポートしていません。疑似ニーモ
- ニック「adsize」を出力するだけで、16ビットアドレッシングのニーモニックは発
- 生しません。16ビットアドレッシングなんてあまり使わないんじゃないかと思った
- ものですから。
- 逆アセンブルリストは標準出力に出力されます。ファイルに出力する場合はリダイ
- レクトしてください。ダンプデータ付きの出力は次のようになります。
-
- TEST.O
- _00000000: nop #90
- _00000001: nop #90
- _00000002: movl %cr0,%eax #0F 20 C0
- _00000005: movl %cr2,%eax #0F 20 D0
- _00000008: movl %cr3,%eax #0F 20 D8
- _0000000b: movb $0x01,%al #B0 01
- _0000000d: opsize #66
- _0000000e: movw $0x0001,%ax #B8 01 00
- _00000011: movl $0x00000001,%eax #B8 01 00 00 00
- _00000016: movl (%ebx),%eax #8B 03
- _00000018: movl 0x02(%ebx,%esi,1),%eax #8B 44 33 02
- _0000001c: movl %edx,0x00002000(%ebx,%esi,1) #89 94 33 00 20 00 00
- _00000023: call _0000002d #E8 05 00 00 00
- _00000028: ja _0000002c #77 02
- _0000002a: jmp _00000000 #EB D4
- _0000002c: ret #C3
- _0000002d: movl 0x11111111,%eax #A1 11 11 11 11
-
- ダンプデータ無しの出力は次のようになります。
-
- TEST.O
- _00000000: nop
- _00000001: nop
- _00000002: movl %cr0,%eax
- _00000005: movl %cr2,%eax
- _00000008: movl %cr3,%eax
- _0000000b: movb $0x01,%al
- _0000000d: opsize
- _0000000e: movw $0x0001,%ax
- _00000011: movl $0x00000001,%eax
- _00000016: movl (%ebx),%eax
- _00000018: movl 0x02(%ebx,%esi,1),%eax
- _0000001c: movl %edx,0x00002000(%ebx,%esi,1)
- _00000023: call _0000002d
- _00000028: ja _0000002c
- _0000002a: jmp _00000000
- _0000002c: ret
- _0000002d: movl 0x11111111,%eax
-
- このフォーマットは、GASによる再アセンブルが簡単に(最小の変更で)行えるよ
- うに考えてあります。上の出力は、不用のニーモニック「opsize」を削除すればGA
- Sによってアセンブルが可能です。(使わないラベルも削除した方がよいのでしょう
- が。)
-
-
- ◆GAS形式のニーモニックについて
- ここで、簡単にGASの表記法について説明します。GASの表記は、MASMな
- どとはかなり異なっている点がありますから注意して下さい。いちばん混乱し易いの
- は、オペランドの順番がソース、デスティネーションの順であり、MASMなどとは
- 逆になっている点です。以下に、相違点をまとめます。
- ・ニーモニックの末尾に、オペランドのデータサイズを示す文字b/w/lを
- 付ける。b/w/lは、バイト/ワード/ダブルワードを表わす。
- ・オペランドの順番は、ソース、デスティネーションの順である。
- ・レジスタの名前には、先頭に%を付ける。
- ・即値オペランドには、先頭に$を付ける。
- 私は、どういう場合にオペコード語尾のb,w,lを付けて、どういう場合に付け
- ないのかがよく分かっていません。したがって、この逆アセンブラが出力するニーモ
- ニックにもおかしな所がかなりあると思います。大体意味は分かるのでこれで我慢す
- るか、改良してまともな出力をするようにしてください。
-
-
- ◆著作権について
- Cのソースコードについては完全にフリーとします。改良、改造も可です。実行プ
- ログラムについてはLSI-C86試食版の配布条件に従ってください。(手数料以
- 上の金銭の授受は禁じられている。)
-
-
- ◆私が参考にした文献
- 安藤寿茂(elfin)「gasマニュアル」GNU for TOWNS Rel.2
- 万木嘉弘「80386プログラマーズブック」新紀元社
-